import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class Lesson9 {

    private static AtomicInteger atomicInteger = new AtomicInteger(1);

    private static ExecutorService executorService = new ThreadPoolExecutor(10, 10, 1, TimeUnit.HOURS, new ArrayBlockingQueue(10), r -> {
        Thread thread = new Thread(r);
        thread.setDaemon(true);
        thread.setName("custom-executor-" + atomicInteger.incrementAndGet());
        return thread;
    });

    /**
     *  在两个完成的阶段其中之一上应用函数
     *  下面的例子创建了CompletableFuture, applyToEither处理两个阶段，
     *  在其中之一上应用函数(包保证哪一个被执行)。
     *  本例中的两个阶段一个是应用大写转换在原始的字符串上， 另一个阶段是应用小些转换。
     *
     * */
    public static void main(String[] args) {

        String message = "Message";

        CompletableFuture completableFuture1 = CompletableFuture
                .completedFuture(message)
                .thenApplyAsync(s -> {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return s.toUpperCase();
                }, executorService);

        CompletableFuture completableFuture2 = completableFuture1
                .applyToEither(CompletableFuture.completedFuture(message).thenApplyAsync(s -> s.toLowerCase()), s -> s +" from applyToEither");

        completableFuture2.join();

        System.out.println(completableFuture2.getNow(null));
    }
}
